import sys
import os
import importlib
import argparse
from dotenv import load_dotenv

project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(os.path.abspath(project_root + '/client/'))
sys.path.append(os.path.abspath(project_root + '/middle/'))
sys.path.append(os.path.abspath(project_root + '/controller/'))
easy_interface = importlib.import_module('easy_interface')

from client import config
import logging
from middle.log import setup_logging
logger = logging.getLogger(__name__)



def vul_update_v25():
    logger.info("===============================================================")
    logger.info("vul_update: v25")
    logger.info("===============================================================")
    # 获取经过排序所有数据
    items = easy_interface.get_sorted_all_data(config.Production.V25)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V25)
    logger.info("===============================================================")
    logger.info("vul_update: v25 complete!")
    logger.info("===============================================================")

def vul_update_v20_510e_lts_1070():
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10e lts-1070")
    logger.info("===============================================================")
    # 获取经过排序所有数据
    items = easy_interface.get_sorted_all_data(config.Production.V20_510E_1070)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_510E_1070)
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10e lts-1070 complete!")
    logger.info("===============================================================")

def vul_update_v20_510e_lts_1060():
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10e lts-1060")
    logger.info("===============================================================")
    items = easy_interface.get_sorted_all_data(config.Production.V20_510E_1060)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_510E_1060)
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10e lts-1060 complete!")
    logger.info("===============================================================")


def vul_update_v20_510e_lts_1050():
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10e lts-1050")
    logger.info("===============================================================")
    items = easy_interface.get_sorted_all_data(config.Production.V20_510E_1050)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_510E_1050)
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10e lts-1050 complete!")
    logger.info("===============================================================")

def vul_update_v20_510a_lts_1070():
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10a lts-1070")
    logger.info("===============================================================")
    # 获取经过排序所有数据
    items = easy_interface.get_sorted_all_data(config.Production.V20_510A_1070)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_510A_1070)
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10a lts-1070 complete!")
    logger.info("===============================================================")

def vul_update_v20_510a_lts_1060():
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10a lts-1060")
    logger.info("===============================================================")
    # 获取经过排序所有数据
    items = easy_interface.get_sorted_all_data(config.Production.V20_510A_1060)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_510A_1060)
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10a lts-1060 complete!")
    logger.info("===============================================================")

def vul_update_v20_510a_lts_1050():
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10a lts-1050")
    logger.info("===============================================================")
    # 获取经过排序所有数据
    items = easy_interface.get_sorted_all_data(config.Production.V20_510A_1050)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_510A_1050)
    logger.info("===============================================================")
    logger.info("vul_update: v20 5.10a lts-1050 complete!")
    logger.info("===============================================================")

def vul_update_v20_419e_lts_1070():
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19e lts-1070")
    logger.info("===============================================================")
    items = easy_interface.get_sorted_all_data(config.Production.V20_419E_1070)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_419E_1070)
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19e lts-1070 complete!")
    logger.info("===============================================================")

def vul_update_v20_419e_lts_1060():
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19e lts-1060")
    logger.info("===============================================================")
    items = easy_interface.get_sorted_all_data(config.Production.V20_419E_1060)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_419E_1060)
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19e lts-1060 complete!")
    logger.info("===============================================================")


def vul_update_v20_419e_lts_1050():
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19e lts-1050")
    logger.info("===============================================================")
    items = easy_interface.get_sorted_all_data(config.Production.V20_419E_1050)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_419E_1050)
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19e lts-1050 complete!")
    logger.info("===============================================================")


def vul_update_v20_419a_lts_1070():
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19a lts-1070")
    logger.info("===============================================================")
    items = easy_interface.get_sorted_all_data(config.Production.V20_419A_1070)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_419A_1070)
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19a lts-1070 complete!")
    logger.info("===============================================================")


def vul_update_v20_419a_lts_1060():
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19a lts-1060")
    logger.info("===============================================================")
    items = easy_interface.get_sorted_all_data(config.Production.V20_419A_1060)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_419A_1060)
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19a lts-1060 complete!")
    logger.info("===============================================================")


def vul_update_v20_419a_lts_1050():
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19a lts-1050")
    logger.info("===============================================================")
    items = easy_interface.get_sorted_all_data(config.Production.V20_419A_1050)
    # 处理所有数据得到需要更新的数据
    easy_interface.update_polluted_cve_items(items, config.Production.V20_419A_1050)
    logger.info("===============================================================")
    logger.info("vul_update: v20 4.19a lts-1050 complete!")
    logger.info("===============================================================")


def should_not_skip(value):
    """返回是否需要跳过"""
    return not (value is None or value == "")

def vul_update():
    logger.info("===============================================================")
    logger.info("vul_update: all")
    logger.info("===============================================================")

    if should_not_skip(config.FIX_660_2500_VERSION):
    	vul_update_v25()

    if should_not_skip(config.FIX_510E_1070_VERSION):
    	vul_update_v20_510e_lts_1070()

    if should_not_skip(config.FIX_510E_1060_VERSION):
    	vul_update_v20_510e_lts_1060()

    if should_not_skip(config.FIX_510E_1050_VERSION):
    	vul_update_v20_510e_lts_1050()

    if should_not_skip(config.FIX_510A_1070_VERSION):
    	vul_update_v20_510a_lts_1070()

    if should_not_skip(config.FIX_510A_1060_VERSION):
    	vul_update_v20_510a_lts_1060()

    if should_not_skip(config.FIX_510A_1050_VERSION):
    	vul_update_v20_510a_lts_1050()

    if should_not_skip(config.FIX_419A_1070_VERSION):
    	vul_update_v20_419a_lts_1070()

    if should_not_skip(config.FIX_419A_1060_VERSION):
    	vul_update_v20_419a_lts_1060()

    if should_not_skip(config.FIX_419A_1050_VERSION):
    	vul_update_v20_419a_lts_1050()

    if should_not_skip(config.FIX_419E_1070_VERSION):
    	vul_update_v20_419e_lts_1070()

    if should_not_skip(config.FIX_419E_1060_VERSION):
    	vul_update_v20_419e_lts_1060()

    if should_not_skip(config.FIX_419E_1050_VERSION):
    	vul_update_v20_419e_lts_1050()

    logger.info("===============================================================")
    logger.info("vul_update: all complete!")
    logger.info("===============================================================")

def init_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("-fixer", "--fixer", type=str, required=True,
            help="修复者")
    parser.add_argument("-ver25", "--ver25", type=str,
            help="v25 修复版本")
    parser.add_argument("-ver20_510_1070e", "--ver20_510_1070e", type=str,
            help="v20 510 1070e 修复版本")
    parser.add_argument("-ver20_510_1060e", "--ver20_510_1060e", type=str,
            help="v20 510 1060e 修复版本")
    parser.add_argument("-ver20_510_1050e", "--ver20_510_1050e", type=str,
            help="v20 510 1050e 修复版本")
    parser.add_argument("-ver20_510_1070a", "--ver20_510_1070a", type=str,
            help="v20 510 1070a 修复版本")
    parser.add_argument("-ver20_510_1060a", "--ver20_510_1060a", type=str,
            help="v20 510 1060a 修复版本")
    parser.add_argument("-ver20_510_1050a", "--ver20_510_1050a", type=str,
            help="v20 510 1050a 修复版本")
    parser.add_argument("-ver20_419_1070a", "--ver20_419_1070a", type=str,
            help="v20 419 1070a 修复版本")
    parser.add_argument("-ver20_419_1060a", "--ver20_419_1060a", type=str,
            help="v20 419 1060a 修复版本")
    parser.add_argument("-ver20_419_1050a", "--ver20_419_1050a", type=str,
            help="v20 419 1050a 修复版本")
    parser.add_argument("-ver20_419_1070e", "--ver20_419_1070e", type=str,
            help="v20 419 1070e 修复版本")
    parser.add_argument("-ver20_419_1060e", "--ver20_419_1060e", type=str,
            help="v20 419 1060e 修复版本")
    parser.add_argument("-ver20_419_1050e", "--ver20_419_1050e", type=str,
            help="v20 419 1050e 修复版本")
    args = parser.parse_args()
    config.FIXER = args.fixer
    config.FIX_660_2500_VERSION = args.ver25
    #
    config.FIX_510E_1070_VERSION = args.ver20_510_1070e
    config.FIX_510E_1060_VERSION = args.ver20_510_1060e
    config.FIX_510E_1050_VERSION = args.ver20_510_1050e
    #
    config.FIX_510A_1070_VERSION = args.ver20_510_1070a
    config.FIX_510A_1060_VERSION = args.ver20_510_1060a
    config.FIX_510A_1050_VERSION = args.ver20_510_1050a
    #
    config.FIX_419A_1070_VERSION = args.ver20_419_1070a
    config.FIX_419A_1060_VERSION = args.ver20_419_1060a
    config.FIX_419A_1050_VERSION = args.ver20_419_1050a
    #
    config.FIX_419E_1070_VERSION = args.ver20_419_1070e
    config.FIX_419E_1060_VERSION = args.ver20_419_1060e
    config.FIX_419E_1050_VERSION = args.ver20_419_1050e
    logger.info("FIXER: {}".format(config.FIXER))
    logger.info("FIX_660_2500_VERSION: {}".format(config.FIX_660_2500_VERSION))
    logger.info("FIX_510E_1070_VERSION: {}".format(config.FIX_510E_1070_VERSION))
    logger.info("FIX_510E_1060_VERSION: {}".format(config.FIX_510E_1060_VERSION))
    logger.info("FIX_510E_1050_VERSION: {}".format(config.FIX_510E_1050_VERSION))
    logger.info("FIX_510A_1070_VERSION: {}".format(config.FIX_510A_1070_VERSION))
    logger.info("FIX_510A_1060_VERSION: {}".format(config.FIX_510A_1060_VERSION))
    logger.info("FIX_510A_1050_VERSION: {}".format(config.FIX_510A_1050_VERSION))
    logger.info("FIX_419A_1070_VERSION: {}".format(config.FIX_419A_1070_VERSION))
    logger.info("FIX_419A_1060_VERSION: {}".format(config.FIX_419A_1060_VERSION))
    logger.info("FIX_419A_1050_VERSION: {}".format(config.FIX_419A_1050_VERSION))
    logger.info("FIX_419E_1070_VERSION: {}".format(config.FIX_419E_1070_VERSION))
    logger.info("FIX_419E_1060_VERSION: {}".format(config.FIX_419E_1060_VERSION))
    logger.info("FIX_419E_1050_VERSION: {}".format(config.FIX_419E_1050_VERSION))

def load_header():
    """
    将 api_token 脱敏，从 .env 中加载
    """
    # 加载 .env 文件
    load_dotenv()
    # 动态注入 API Token（如果存在）
    API_TOKEN = os.getenv("API_TOKEN")  # 从 .env 读取
    if API_TOKEN:
        # 必须批定位置 HEADER 才能正常使用
        headers_list = list(config.BASE_HEADERS.items())
        headers_list.insert(5, ("Cookie", f"api_token={API_TOKEN}"))  # 插入到第5个位置
        config.BASE_HEADERS = dict(headers_list)
    else:
        raise ValueError("API_TOKEN 未在 .env 文件中配置！")
    logger.info(f"API_TOKEN: {API_TOKEN}")
    logger.info(f"BASE_HEADERS: {config.BASE_HEADERS}")

def load_deepseekapi_key():
    """
    将 api_token 脱敏，从 .env 中加载
    """
    # 加载 .env 文件
    load_dotenv()
    # 动态注入 API Token（如果存在）
    DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")  # 从 .env 读取
    if DEEPSEEK_API_KEY:
        config.DEEPSEEK_API_KEY = DEEPSEEK_API_KEY
    else:
        raise ValueError("DEEPSEEK_API_KEY 未在 .env 文件中配置！")
    logger.info(f"DEEPSEKK_API_KEY: {DEEPSEEK_API_KEY}")

def main():
    logger.info("命令行入口")
    init_args()
    load_header()
    vul_update()

if __name__ == "__main__":
    main()


def vul_get_info():
    """
    获取所有的 vul 的状态信息，包含所有的产品线。
    """
    load_header()
    items = easy_interface.get_sorted_all_data(config.Production.V25)
    easy_interface.get_vul_info(items, config.Production.V25)

    items = easy_interface.get_sorted_all_data(config.Production.V20_510E_1070)
    easy_interface.get_vul_info(items, config.Production.V20_510E_1070)

    items = easy_interface.get_sorted_all_data(config.Production.V20_510E_1060)
    easy_interface.get_vul_info(items, config.Production.V20_510E_1060)

    items = easy_interface.get_sorted_all_data(config.Production.V20_510E_1050)
    easy_interface.get_vul_info(items, config.Production.V20_510E_1050)

    items = easy_interface.get_sorted_all_data(config.Production.V20_510A_1070)
    easy_interface.get_vul_info(items, config.Production.V20_510A_1070)

    items = easy_interface.get_sorted_all_data(config.Production.V20_510A_1060)
    easy_interface.get_vul_info(items, config.Production.V20_510A_1060)

    items = easy_interface.get_sorted_all_data(config.Production.V20_510A_1050)
    easy_interface.get_vul_info(items, config.Production.V20_510A_1050)

    items = easy_interface.get_sorted_all_data(config.Production.V20_419A_1070)
    easy_interface.get_vul_info(items, config.Production.V20_419A_1070)

    items = easy_interface.get_sorted_all_data(config.Production.V20_419A_1060)
    easy_interface.get_vul_info(items, config.Production.V20_419A_1060)

    items = easy_interface.get_sorted_all_data(config.Production.V20_419A_1050)
    easy_interface.get_vul_info(items, config.Production.V20_419A_1050)

    items = easy_interface.get_sorted_all_data(config.Production.V20_419E_1070)
    easy_interface.get_vul_info(items, config.Production.V20_419E_1070)

    items = easy_interface.get_sorted_all_data(config.Production.V20_419E_1060)
    easy_interface.get_vul_info(items, config.Production.V20_419E_1060)

    items = easy_interface.get_sorted_all_data(config.Production.V20_419E_1050)
    easy_interface.get_vul_info(items, config.Production.V20_419E_1050)


def init_am_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("-gitname", "--gitname", type=str, required=True,
            help="git 用户名")
    parser.add_argument("-gitemail", "--gitemail", type=str, required=True,
            help="git email 名")
    parser.add_argument("-xlsxpath", "--xlsxpath", type=str, required=True,
            help="补丁对应的 xlsx 表格路径")
    parser.add_argument("-codepath", "--codepath", type=str, required=True,
            help="代码仓库路径")
    parser.add_argument("-codebranch", "--codebranch", type=str, required=True,
            help="代码仓库分支")
    parser.add_argument("-upcodepath", "--upcodepath", type=str, required=True,
            help="上游代码仓库路径")
    parser.add_argument("-upcodebranch", "--upcodebranch", type=str, required=True,
            help="上游代码仓库分支")
    parser.add_argument("-start", "--start", type=str,
            help="从表格的第几个开始或者继续")
    args = parser.parse_args()
    config.AM_CODE_PATH=args.codepath
    config.AM_CODE_BRANCH=args.codebranch
    config.AM_XLSX_PATH=args.xlsxpath
    config.AM_GIT_NAME=args.gitname
    config.AM_GIT_EMAIL=args.gitemail
    config.UPSTREAM_CODE_PATH=args.upcodepath
    config.UPSTREAM_CODE_BRANCH=args.upcodebranch
    if args.start != None:
        config.XLSX_START_NUMBER=args.start

def xlsx_am_patches():
    """
    通过网页打上没有冲突的补丁，入口函数。
    """
    logger.info("===============================================================")
    logger.info("vul am patches start")
    logger.info("===============================================================")
    init_am_args()
    easy_interface.xlsx_am_process()
    logger.info("===============================================================")
    logger.info("vul am patches complete")
    logger.info("===============================================================")


def init_exploit_args():
    parser = argparse.ArgumentParser()
   
    parser.add_argument("-upcodepath", "--upcodepath", type=str, required=True,
            help="上游代码仓库路径")

    parser.add_argument("-xlsxpath", "--xlsxpath", type=str, required=True,
            help="补丁对应的 xlsx 表格路径")
    args = parser.parse_args()
    config.UPSTREAM_CODE_PATH=args.upcodepath
    config.EXPLOITS_XLSX_PATH=args.xlsxpath
        
def xlsx_get_exploits():
    """
    获取一系列 cve 的攻击方法。
    """
    logger.info("===============================================================")
    logger.info("xlsx get exploits start")
    logger.info("===============================================================")
    load_deepseekapi_key()
    init_exploit_args()
    easy_interface.xlsx_get_exploits(config.EXPLOITS_XLSX_PATH)
    logger.info("===============================================================")
    logger.info("xlsx get exploits complete")
    logger.info("===============================================================")
